package util;

import org.sqlite.SQLiteConfig;
import org.sqlite.SQLiteDataSource;
import javax.sql.DataSource;
import java.io.File;
import java.sql.*;

/**
 * 数据库的工具类，创建数据源，创建数据库连接
 * 指向外部听SQLite数据库的连接即可，数据源不提供（封装在工具类内部）
 * JDBC四步走
 */
public class DBUtil {
    private volatile static DataSource DATASOURCE;

    //获取数据源方法，使用单例double-check单例模式获取数据源对象
    private static DataSource getDataSourse() {
        if (DATASOURCE == null) {
            //多线程下，只有一个线程能进入该代码块
            synchronized (DBUtil.class) {
                if (DATASOURCE == null) {
                    //SQLite数据库没有账号和密码，只需要配置日期格式即可
                    SQLiteConfig config = new SQLiteConfig();
                    config.setDateStringFormat(Util.DATE_PATTERN);
                    DATASOURCE = new SQLiteDataSource();
                    //配置数据源的url是SQLite子类独有的方法，因此向下转型
                    ((SQLiteDataSource) DATASOURCE).setUrl(getUrl());
                }
            }
        }
        return DATASOURCE;
    }

    /**
     * 配置SQLite数据库的地址
     * SQLite没有服务端和客户端，因此只需要指定SQLite数据库的地址即可
     *
     * @return
     */
    private static String getUrl() {
        String path = "D:\\IDEA项目\\search_everything\\target";
        String url = "jdbc:sqlite://" + path + File.separator + "search_everything.db";
        System.out.println("获取数据库的连接为:" + url);
        return url;
    }

    public static Connection getConnection() throws SQLException {
        return getDataSourse().getConnection();
    }

    public static void main(String[] args) throws SQLException {
        System.out.println(getConnection());
    }

    /**
     *关闭资源的方法
     * @param connection
     * @param statement
     */
    public static void close(Connection connection, Statement statement) {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public static void close(Connection connection, PreparedStatement ps, ResultSet rs) {
        close(connection,ps);
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}